package com.sojson.util.idcard;

import com.sojson.config.exception.bean.Status;
import com.sojson.enums.core.ESex;
import com.sojson.util.idcard.tysj.IdCardTysjUtil;

import cn.hutool.core.util.IdcardUtil;

/**
 * 身份证工具类
 * 
 * @author liu
 * @date 2021-07-29
 */
public class IdCardUtil {

    /** 中国公民新版身份证号码长度 */
    public static final IdCardUtilInterface ID_CARD_UTIL = IdCardTysjUtil.getInstances();
    /** 中国公民新版身份证号码长度 */
    public static final int CHINA_ID_NEW_LENGTH = 18;
    /** 中国公民旧版身份证号码长度 */
    public static final int CHINA_ID_OLD_LENGTH = 15;
    /** 中国公民旧版身份证号码年份前缀 */
    public static final String CHINA_ID_OLD_YEAR_PREFIX = "19";

    /**
     * 根据身份编号获取年龄(周岁: 每过一个生日就长一岁)
     *
     * @param idCard 身份编号
     * @return 年龄
     */
    public static Integer getAge(String idCard) {
        // int len = idCard.length();
        // // 获取当前时间的年月日
        // LocalDate nowLocalDate = DateUtil.nowLocalDate();
        // int year = DateUtil.getYear(nowLocalDate);
        // int month = DateUtil.getMonth(nowLocalDate);
        // int day = DateUtil.getDate(nowLocalDate);
        //
        // // 获取身份证上的出生年月日
        // int selectYear = 0;
        // int selectMonth = 0;
        // int selectDay = 0;
        // if (len == CHINA_ID_NEW_LENGTH) {
        // selectYear = Integer.parseInt(idCard.substring(6, 10));
        // selectMonth = Integer.parseInt(idCard.substring(10, 12));
        // selectDay = Integer.parseInt(idCard.substring(12, 14));
        //
        // } else if (len == CHINA_ID_OLD_LENGTH) {
        // selectYear = Integer.parseInt(CHINA_ID_OLD_YEAR_PREFIX + idCard.substring(6, 8));
        // selectMonth = Integer.parseInt(idCard.substring(8, 10));
        // selectDay = Integer.parseInt(idCard.substring(10, 12));
        // } else {
        // return null;
        // }
        //
        // // 获取年龄
        // int age = year - selectYear;
        // // 如果出生年份还没到或者今年刚出生就返回0
        // if (age <= 0) {
        // return 0;
        // }
        //
        // // 如果生日月份还没到就返回年龄-1
        // if (month - selectMonth < 0) {
        // return age - 1;
        // } else if (month - selectMonth > 0) {
        // // 如果生日月份超了就返回年龄
        // return age;
        // }
        //
        // // 如果生日还没到就返回年龄-1
        // if (day - selectDay < 0) {
        // return age - 1;
        // }
        //
        // // 如果生日到了就返回年龄
        return IdcardUtil.getAgeByIdCard(idCard);
    }

    /**
     * 根据身份编号获取年龄(虚岁: 出生时为一岁,然后,每过一个春节就长一岁)
     *
     * @param idCard 身份编号
     * @return 年龄
     */
    public static Integer getAgeYears(String idCard) {
        return getAge(idCard);
    }

    /**
     * 根据身份编号获取生日
     *
     * @param idCard 身份编号
     * @return 生日(yyyyMMdd)
     */
    public static String getBirth(String idCard) {
        return IdcardUtil.getBirth(idCard);
    }

    /**
     * 根据身份编号获取生日年
     *
     * @param idCard 身份编号
     * @return 生日(yyyy)
     */
    public static Short getYear(String idCard) {
        return IdcardUtil.getYearByIdCard(idCard);
    }

    /**
     * 根据身份编号获取生日月
     *
     * @param idCard 身份编号
     * @return 生日(MM)
     */
    public static Short getMonth(String idCard) {
        return IdcardUtil.getMonthByIdCard(idCard);
    }

    /**
     * 根据身份编号获取生日天
     *
     * @param idCard 身份编号
     * @return 生日(dd)
     */
    public static Short getDay(String idCard) {
        return IdcardUtil.getDayByIdCard(idCard);
    }

    /**
     * 根据性别代码获取性别
     *
     * @param code
     * @return
     */
    public static ESex getSex(Integer code) {
        ESex[] values = ESex.values();

        for (ESex eSex : values) {
            if (eSex.getCode() == code) {
                return eSex;
            }
        }
        return ESex.UNKNOWN;
    }

    /**
     * 根据身份编号获取性别
     *
     * @param idCard 身份编号
     * @return
     */
    public static ESex getSex(String idCard) {
        ESex sex = ESex.UNKNOWN;
        if (IdcardUtil.getGenderByIdCard(idCard) == 0) {
            // 女
            sex = ESex.GIRL;
        } else if (IdcardUtil.getGenderByIdCard(idCard) == 1) {
            // 男
            sex = ESex.MAN;
        }
        return sex;
    }

    /**
     * 验证姓名和身份证号是否匹配
     * 
     * @param name      姓名
     * @param idCard    身份证号
     * @return
     * @throws Exception 
     */
    public static Status nameAndIdCard(String name, String idCard) throws Exception {
        return ID_CARD_UTIL.nameAndIdCard(name, idCard);
    }

}